package com.chencong.service;

import com.alibaba.fastjson.JSONObject;
import com.chencong.util.Constant;

import java.io.*;
import java.util.HashMap;
import java.util.Map;

/**
 * @author chencong
 * @date 2020/12/14 下午5:29
 */
public class PageService {
    private DataOutputStream dos;

    public PageService(DataOutputStream dos) {
        this.dos = dos;
    }

    public void toPage(String url) throws Exception {
        File file = new File(Constant.SRC + url);
        System.out.println(url+"-"+file.exists());
        //如果页面没找到,发送404页面
        if (!file.exists()) {
            file = new File(Constant.SRC + "/404.html");
        }
        try ( //创建缓存字节输入流读取请求的文件
              BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));) {

            //状态码: 后端发送给前端 如果发送成功 200
            dos.writeBytes("HTTP/1.1 200 OK\n");
            //告诉浏览器数据的长度
            dos.writeBytes(("Content-Length: " + bis.available() + "\n"));
            /**
             * 此处的url中包含了html  和css  的一些静态的资源
             *    但是静态资源在前端页面的渲染方式又不一样  所以在这里做个判断
             */
            if (url.endsWith(".html")) {
                dos.writeBytes("Content-Type: text/html; charset=utf-8;\n");
            } else if (url.endsWith(".css")) {
                dos.writeBytes("Content-Type: text/css; charset=utf-8;\n");
            }
            //使用换行符对响应头和文件数据进行分开  不然文件数据没法显示在页面上
            dos.write("\n".getBytes());
            byte[] buffer = new byte[1024];
            int len;
            while ((len = bis.read(buffer)) != -1) {
                dos.write(buffer, 0, len);
            }
            //通信管道里的流不需要关,关了有可能造成数据丢失
            bis.close();//本地读取文件的流可以关闭
//            dos.close();//通信管道里的流不需要关
        }
    }

    public <T> void sendData(T t) throws Exception {
        sendData(t, true);
    }

    /**
     * 向页面发送数据和状态码
     *
     * @param t
     * @param success
     * @throws Exception
     */
    public <T> void sendData(T t, boolean success) throws Exception {
        if (success) {
            dos.write("HTTP/1.1 200 OK\n".getBytes());
        } else {
            dos.write("HTTP/1.1 400 bad_request\n".getBytes());
        }
        Map<String, T> responseMap = new HashMap<String, T>();
        responseMap.put("data", t);
        String response = JSONObject.toJSONString(responseMap);
        //告诉前端页面 后端响应的数据是以json格式返回的
        dos.writeBytes("Content-Type: application/json; charset=utf-8\n");
        //返回的数据的长度
        dos.writeBytes("Content-Length: " + response.getBytes().length + "\n");
        dos.writeBytes("\n");
        dos.write(response.getBytes()); //给出一个响应数据 k-v json
        dos.flush();

    }
}
